﻿using System;
using System.Data;
using DTO.Clases;
using DataAccessLayer.Clases;

namespace BussinesLayer.Clases
{
    /// <summary>
    /// Representa una clase de logica de negocio de Factura Venta.
    /// </summary>
    public class BussinesFacturaVenta
    {
        /// <summary>
        /// Proporciona acceso a la capa de datos de FacturaVenta.
        /// </summary>
        private DaoFacturaVenta miDaoFacturaVenta;

        /// <summary>
        /// Proporciona acceso a la capa de datos de ProductoFacturaVenta.
        /// </summary>
        private DaoProductoFacturaVenta miDaoProducto;

        /// <summary>
        /// Inicializa una nueva instancia de la clase BussinesFacturaVenta.
        /// </summary>
        public BussinesFacturaVenta()
        {
            this.miDaoFacturaVenta = new DaoFacturaVenta();
            this.miDaoProducto = new DaoProductoFacturaVenta();
        }

        /// <summary>
        /// Obtiene el Número consecutivo a se asignado en la Factura.
        /// </summary>
        /// <returns></returns>
        public string ObtenerNumero(bool contado)
        {
            return miDaoFacturaVenta.ObtenerNumero(contado);
        }

        /// <summary>
        /// Obtiene el número correspondiente al rango final del registro de la Dian.
        /// </summary>
        /// <returns></returns>
        public long ObtenerRangoFinal(bool contado)
        {
            return miDaoFacturaVenta.ObtenerRangoFinal(contado);
        }

        /// <summary>
        /// Ingresa el registro de una Factura a base de datos.
        /// </summary>
        /// <param name="factura">Factura a ingresar.</param>
        /// <param name="edicion">Indica si la factura proviene de una edición de la misma.</param>
        public void IngresarFactura(FacturaVenta factura, bool edicion)
        {
            miDaoFacturaVenta.IngresarFactura(factura, edicion);
        }

        /// <summary>
        /// Obtiene los datos de la factura de venta para su impresión.
        /// </summary>
        /// <param name="numero">Número de la factura de venta.</param>
        /// <returns></returns>
        public DataSet PrintFacturaVenta(string numero)
        {
            return miDaoFacturaVenta.PrintFacturaVenta(numero);
        }

        /// <summary>
        /// Obtiene los datos de los productos en una factura de venta para su impresión.
        /// </summary>
        /// <param name="numero">Número de la factura de venta.</param>
        /// <param name="descuento">Indica si el producto aplica descuento o no (recargo).</param>
        /// <returns></returns>
        public DataSet PrintProducto(string numero, bool descuento)
        {
            return miDaoProducto.PrintProducto(numero, descuento);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por número.
        /// </summary>
        /// <param name="numero">Número de la Factura a consultar.</param>
        /// <returns></returns>
        public DataTable ConsultaNumero(string numero)
        {
            return miDaoFacturaVenta.ConsultaNumero(numero);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Estado de la Factura.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaEstado(int estado, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaEstado(estado, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de resultado de la consulta de Factura de Venta 
        /// por Estado de la Factura.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <returns></returns>
        public long GetRowsConsultaEstado(int estado)
        {
            return miDaoFacturaVenta.GetRowsConsultaEstado(estado);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Estado de la Factura 
        /// y fecha de ingreso de la misma.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="fecha">Fecha de ingreso a consultar la factura.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaEstadoFechaIngreso
            (int estado, DateTime fecha, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaEstadoFechaIngreso
                (estado, fecha, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de Factura de Venta por Estado de la Factura 
        /// y fecha de ingreso de la misma.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="fecha">Fecha de ingreso a consultar la factura.</param>
        /// <returns></returns>
        public long GetRowsConsultaEstadoFechaIngreso(int estado, DateTime fecha)
        {
            return miDaoFacturaVenta.GetRowsConsultaEstadoFechaIngreso(estado, fecha);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Estado de la Factura 
        /// y un periodo de fechas para la consulta en la fecha de ingreso.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaEstadoPeriodoIngreso
            (int estado, DateTime fecha1, DateTime fecha2, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaEstadoPeriodoIngreso
                (estado, fecha1, fecha2, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de Factura de Venta por Estado de la Factura 
        /// y un periodo de fechas para la consulta en la fecha de ingreso.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <returns></returns>
        public long GetRowsConsultaEstadoPeriodoIngreso
            (int estado, DateTime fecha1, DateTime fecha2)
        {
            return miDaoFacturaVenta.GetRowsConsultaEstadoPeriodoIngreso(estado, fecha1, fecha2);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Cliente 
        /// relacionado con la misma.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaPorCliente(string cliente, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaPorCliente(cliente, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de de Factura de Venta por Cliente 
        /// relacionado con la misma.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <returns></returns>
        public long GetRowsConsultaPorCliente(string cliente)
        {
            return miDaoFacturaVenta.GetRowsConsultaPorCliente(cliente);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por estado y Cliente.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaPorEstadoYcliente
            (int estado, string cliente, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaPorEstadoYcliente
                (estado, cliente, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de Factura de Venta por estado y Cliente.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <returns></returns>
        public long GetRowsConsultaPorEstadoYcliente(int estado, string cliente)
        {
            return miDaoFacturaVenta.GetRowsConsultaPorEstadoYcliente(estado, cliente);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Cliente 
        /// y fecha de ingreso de la misma.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="fecha">Fecha de ingreso a consultar la factura.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaPorClienteIngreso
            (string cliente, DateTime fecha, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaPorClienteIngreso
                (cliente, fecha, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de Factura de Venta por Cliente 
        /// y fecha de ingreso de la misma.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="fecha">Fecha de ingreso a consultar la factura.</param>
        /// <returns></returns>
        public long GetRowsConsultaPorClienteIngreso(string cliente, DateTime fecha)
        {
            return miDaoFacturaVenta.GetRowsConsultaPorClienteIngreso(cliente, fecha);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Estado, 
        /// Cliente y fecha de ingreso.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="fecha">Fecha de ingreso a consultar la factura.</param>
        /// <returns></returns>
        public DataTable ConsultaPorEstadoClienteIngreso
            (int estado, string cliente, DateTime fecha)
        {
            return 
                miDaoFacturaVenta.ConsultaPorEstadoClienteIngreso(estado, cliente, fecha);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Cliente 
        /// en un periodo de fechas de ingreso.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaPorClientePeriodoIngreso
            (string cliente, DateTime fecha1, DateTime fecha2, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaPorClientePeriodoIngreso
                (cliente, fecha1, fecha2, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de Factura de Venta por Cliente 
        /// en un periodo de fechas de ingreso.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <returns></returns>
        public long GetRowsConsultaPorClientePeriodoIngreso
            (string cliente, DateTime fecha1, DateTime fecha2)
        {
            return miDaoFacturaVenta.GetRowsConsultaPorClientePeriodoIngreso(cliente, fecha1, fecha2);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de Factura de Venta por Estado, 
        /// Cliente y un periodo entre fechas de ingreso.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaPorEstadoClientePeriodoIngreso
            (int estado, string cliente, DateTime fecha1, DateTime fecha2, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaPorEstadoClientePeriodoIngreso
                (estado, cliente, fecha1, fecha2, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de Factura de Venta por Estado, 
        /// Cliente y un periodo entre fechas de ingreso.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <returns></returns>
        public long GetRowsEstadoClientePeriodoIngreso
            (int estado, string cliente, DateTime fecha1, DateTime fecha2)
        {
            return miDaoFacturaVenta.GetRowsEstadoClientePeriodoIngreso(estado, cliente, fecha1, fecha2);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de las Facturas de Venta 
        /// que se encuentran en mora hasta la fecha actual.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="fecha">Fecha actual de la consulta.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaEnMora
            (int estado, DateTime fecha, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaEnMora
                (estado, fecha, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de Facturas de Venta 
        /// que se encuentran en mora hasta la fecha actual.
        /// </summary>
        /// <param name="estado">Estado (Crédito) de la factura a consultar.</param>
        /// <param name="fecha">Fecha actual de la consulta.</param>
        /// <returns></returns>
        public long GetRowsConsultaEnMora(int estado, DateTime fecha)
        {
            return miDaoFacturaVenta.GetRowsConsultaEnMora(estado, fecha);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de las Facturas de Venta 
        /// de un Cliente que se encuentran en mora hasta la fecha actual.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="fecha">Fecha actual de la consulta.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaClienteEnMora
            (string cliente, int estado, DateTime fecha, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaClienteEnMora
                (cliente, estado, fecha, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de las Facturas de Venta 
        /// de un Cliente que se encuentran en mora hasta la fecha actual.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="estado">Estado (Crédito) de la factura a consultar.</param>
        /// <param name="fecha">Fecha actual de la consulta.</param>
        /// <returns></returns>
        public long GetRowsConsultaClienteEnMora(string cliente, int estado, DateTime fecha)
        {
            return miDaoFacturaVenta.GetRowsConsultaClienteEnMora(cliente, estado, fecha);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de las Facturas de Venta 
        /// con un tope en la fecha límite.
        /// </summary>
        /// <param name="estado">Estado de la factura a consultar.</param>
        /// <param name="fecha">Fecha límite hasta donde se quiere consultar.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaEstadoFechaLimite
                         (int estado, DateTime fecha, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaEstadoFechaLimite
                (estado, fecha, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de las Facturas de Venta 
        /// con un tope en la fecha límite.
        /// </summary>
        /// <param name="estado">Estado (Crédito) de la factura a consultar.</param>
        /// <param name="fecha">Fecha límite hasta donde se quiere consultar.</param>
        /// <returns></returns>
        public long GetRowsConsultaEstadoFechaLimite(int estado, DateTime fecha)
        {
            return miDaoFacturaVenta.GetRowsConsultaEstadoFechaLimite(estado, fecha);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de las Facturas de Venta 
        /// en crédito en un periodo de fechas.
        /// </summary>
        /// <param name="estado">Estado (Crédito) de la factura a consultar.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaCreditoPeriodo
            (int estado, DateTime fecha1, DateTime fecha2, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaCreditoPeriodo
                (estado, fecha1, fecha2, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de las Facturas de Venta 
        /// en crédito en un periodo de fechas.
        /// </summary>
        /// <param name="estado">Estado (Crédito) de la factura a consultar.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <returns></returns>
        public long GetRowsConsultaCreditoPeriodo(int estado, DateTime fecha1, DateTime fecha2)
        {
            return miDaoFacturaVenta.GetRowsConsultaCreditoPeriodo(estado, fecha1, fecha2);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de las Facturas de Venta 
        /// en Crédito de un Cliente.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="estado">Estado (Crédito) de la factura a consultar.</param>
        /// <param name="fecha">Fecha límite hasta donde se quiere consultar.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaClienteCreditoLimite
            (string cliente, int estado, DateTime fecha, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaClienteCreditoLimite
                (cliente, estado, fecha, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de las Facturas de Venta 
        /// en Crédito de un Cliente.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="estado">Estado (Crédito) de la factura a consultar.</param>
        /// <param name="fecha">Fecha límite hasta donde se quiere consultar.</param>
        /// <returns></returns>
        public long GetRowsConsultaClienteCreditoLimite(string cliente, int estado, DateTime fecha)
        {
            return miDaoFacturaVenta.GetRowsConsultaClienteCreditoLimite(cliente, estado, fecha);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de las Facturas de Venta 
        /// en Crédito de un Cliente en un periodo determinado.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="estado">Estado (Crédito) de la factura a consultar.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <param name="rowBase">Registro base para la consulta.</param>
        /// <param name="rowMax">Número de registros a recuperar.</param>
        /// <returns></returns>
        public DataTable ConsultaClienteCreditoLimitePeriodo
            (string cliente, int estado, DateTime fecha1, DateTime fecha2, int rowBase, int rowMax)
        {
            return miDaoFacturaVenta.ConsultaClienteCreditoLimitePeriodo
                (cliente, estado, fecha1, fecha2, rowBase, rowMax);
        }

        /// <summary>
        /// Obtiene el total de registros de la consulta de las Facturas de Venta 
        /// en Crédito de un Cliente en un periodo determinado.
        /// </summary>
        /// <param name="cliente">Cliente a consultar factura de venta.</param>
        /// <param name="estado">Estado (Crédito) de la factura a consultar.</param>
        /// <param name="fecha1">Primer rango de fecha.</param>
        /// <param name="fecha2">Segundo rango de fecha.</param>
        /// <returns></returns>
        public long GetRowsConsultaClienteCreditoLimitePeriodo
            (string cliente, int estado, DateTime fecha1, DateTime fecha2)
        {
            return miDaoFacturaVenta.GetRowsConsultaClienteCreditoLimitePeriodo
                                                            (cliente, estado, fecha1, fecha2);
        }

        /// <summary>
        /// Obtiene el resultado de la consulta de los productos de una Factura de Venta.
        /// </summary>
        /// <param name="numero">Número de la Factura de Venta.</param>
        /// <param name="descuento">Indica si la factura aplica descuento o no (Recargo)</param>
        /// <returns></returns>
        public DataTable ProductoFacturaVenta(string numero, bool descuento)
        {
            var miTabla = CrearDataTable();
            var tabla = miDaoProducto.ProductoFacturaVenta(numero);
            foreach (DataRow row in tabla.Rows)
            {
                var color = new ElColor();
                color.MapaBits = row["Color"].ToString();
                var row_ = miTabla.NewRow();
                row_["Id"] = row["Id"];
                row_["Codigo"] = row["Codigo"];
                row_["Articulo"] = row["Producto"];
                row_["Unidad"] = row["Unidad"];
                row_["IdMedida"] = row["IdMedida"];
                row_["Medida"] = row["Medida"];
                row_["IdColor"] = row["IdColor"];
                row_["Color"] = color.ImagenBit;
                row_["Cantidad"] = row["Cantidad"];
                row_["ValorUnitario"] = row["Valor"];
                if (descuento)
                {
                    row_["Descuento"] = row["Descuento"].ToString() + "%";
                    row_["ValorMenosDescto"] = Convert.ToDouble(row["Valor"]) -
                        (Convert.ToDouble(row["Valor"]) * Convert.ToDouble(row["Descuento"]) / 100);
                }
                else
                {
                    row_["Descuento"] = row["Recargo"].ToString() + "%";
                    row_["ValorMenosDescto"] = Convert.ToDouble(row["Valor"]) +
                        (Convert.ToDouble(row["Valor"]) * Convert.ToDouble(row["Recargo"]) / 100);
                }
                row_["Iva"] = row["Iva"].ToString() + "%";
                row_["ValorIva"] = Convert.ToDouble(row_["ValorMenosDescto"]) * Convert.ToDouble(row["Iva"]) / 100;
                row_["TotalMasIva"] = Convert.ToDouble(row_["ValorMenosDescto"]) +
                    (Convert.ToDouble(row_["ValorMenosDescto"]) * Convert.ToDouble(row["Iva"]) / 100);
                row_["Valor"] = Convert.ToDouble(row_["TotalMasIva"]) * Convert.ToDouble(row["Cantidad"]);
                miTabla.Rows.Add(row_);
            }
            tabla.Clear();
            tabla = null;
            return miTabla;
        }

        /// <summary>
        /// Crea las respectivas columnas del DataTable para ProductoFacturaVenta.
        /// </summary>
        private DataTable CrearDataTable()
        {
            var miTabla = new DataTable();
            miTabla.Columns.Add(new DataColumn("Id", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Codigo", typeof(string)));
            miTabla.Columns.Add(new DataColumn("Articulo", typeof(string)));
            miTabla.Columns.Add(new DataColumn("Unidad", typeof(string)));
            miTabla.Columns.Add(new DataColumn("IdMedida", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Medida", typeof(string)));
            miTabla.Columns.Add(new DataColumn("IdColor", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Color", typeof(System.Drawing.Image)));
            miTabla.Columns.Add(new DataColumn("Cantidad", typeof(int)));
            miTabla.Columns.Add(new DataColumn("ValorUnitario", typeof(int)));
            miTabla.Columns.Add(new DataColumn("Descuento", typeof(string)));
            miTabla.Columns.Add(new DataColumn("ValorMenosDescto", typeof(double)));
            miTabla.Columns.Add(new DataColumn("Iva", typeof(string)));
            miTabla.Columns.Add(new DataColumn("ValorIva", typeof(double)));
            miTabla.Columns.Add(new DataColumn("TotalMasIva", typeof(double)));
            miTabla.Columns.Add(new DataColumn("Valor", typeof(double)));
            return miTabla;
        }
    }
}